Load required packages.

library(tidyverse)
library(magrittr)
library(Matrix)
library(Seurat)
library(extrafont)
library(patchwork)


library(styler)
options(
    styler.addins_style_transformer = "styler::tidyverse_style(indent_by = 4)"
)
Sys.Date()
## [1] "2020-06-17"

Parameters

DATA_DIR <- "../../data/drop-seq"

MIN_GENES_THRESHOLD <- 200

SEED_USE <- 20200616
N_COMPONENTS <- 50
# N_REPLICATES = 5
# PROPORTION_OF_VARS = 0.1
MINIMAL_NUM_CELLS_REQUIRED_FOR_GENE <- 30
MINIMAL_NUM_COUNTS_REQUIRED_FOR_GENE <- 60

N_COMPONENTS_SELECTED <- 10

Data preparation

Functions loading

source(
    file = file.path(
        SCRIPT_DIR,
        "utilities.R"
    )
)

customized_theme_style <- function() {
    theme(
        # axis.text = element_text(family = "Arial", size = 7),
        # axis.title = element_text(family = "Arial", size = 8),
        strip.text = element_text(
            family = "Arial",
            size = 6
        ),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank()
    )
}

Data loading

# load matrix
matrix_readcount_use <- sparseMatrix(
    i = readRDS(file.path(
        DATA_DIR,
        "expr_readcount_raw_csc_indices.rds"
    )),
    p = readRDS(file.path(
        DATA_DIR,
        "expr_readcount_raw_csc_indptr.rds"
    )),
    x = readRDS(file.path(
        DATA_DIR,
        "expr_readcount_raw_csc_values.rds"
    )),
    dims = readRDS(file.path(
        DATA_DIR,
        "expr_readcount_raw_csc_shape.rds"
    )),
    dimnames = readRDS(file.path(
        DATA_DIR,
        "expr_readcount_raw_csc_dimnames.rds"
    )),
    index1 = FALSE
)

matrix_readcount_use <- matrix_readcount_use[
    ,
    sort(colnames(matrix_readcount_use))
]

# format feature names
feature_symbols <- read.table(
    file = "../../data/misc/genes.tsv"
)
feature_symbols <- setNames(
    object = feature_symbols$V2,
    nm = feature_symbols$V1
)
rownames(matrix_readcount_use) <- paste(
    rownames(matrix_readcount_use),
    feature_symbols[rownames(matrix_readcount_use)],
    sep = "_"
) %>% make.names()

colnames(matrix_readcount_use) <- colnames(matrix_readcount_use) %>%
    make.names()

# calculate CPM
matrix_cpm_use <- calc_cpm(matrix_readcount_use)
dim(matrix_cpm_use)
## [1] 27999 27416

Preprocessing

Feature filtering

#  filter low quality cells & uninformative features
matrix_readcount_use <- matrix_readcount_use[
    ,
    Matrix::colSums(matrix_readcount_use > 0) >= MIN_GENES_THRESHOLD
]
dim(matrix_readcount_use)
## [1] 27999 25776
matrix_readcount_use <- matrix_readcount_use[
    Matrix::rowSums(
        matrix_readcount_use > 0
    ) >= MINIMAL_NUM_CELLS_REQUIRED_FOR_GENE,
]
matrix_readcount_use <- matrix_readcount_use[
    Matrix::rowSums(
        matrix_readcount_use
    ) >= MINIMAL_NUM_COUNTS_REQUIRED_FOR_GENE,
]
dim(matrix_readcount_use)
## [1] 16535 25776

Seurat object construction

# begin
seurat_proj <- CreateSeuratObject(
    counts = matrix_readcount_use,
    project = "Reprogram-Seq",
    assay = "RNA",
    min.cells = 0,
    min.features = 0,
    names.field = 1,
    names.delim = "_",
    meta.data = NULL
)
## Warning: Feature names cannot have underscores ('_'), replacing with dashes
## ('-')

Normalization

seurat_proj <- seurat_proj %>%
    NormalizeData(
        normalization.method = "LogNormalize",
        scale.factor = colSums(matrix_readcount_use) %>% median()
    )

Dimensionality reduction

Variable features detection

Inspect variable features.

seurat_proj <- seurat_proj %>%
    FindVariableFeatures(
        selection.method = "vst",
        num.bin = 20,
        nfeatures = 3000,
        verbose = TRUE
    )

Calculate coefficient of variation.

cv <- calc_cv(matrix_cpm_use)

Visualize CV against mean expression.

data.frame(
    mean_expr = rowMeans(matrix_cpm_use),
    cv = cv
) %>%
    rownames_to_column(var = "feature") %>%
    filter(
        mean_expr > 0
    ) %>%
    mutate(
        feature = stringr::str_replace(
            string = feature,
            pattern = "_",
            replacement = "-"
        ),
        is_variable = ifelse(feature %in% VariableFeatures(seurat_proj), 1, 0)
    ) %>%
    arrange(is_variable) %>%
    plot_cv(
        x = mean_expr,
        y = cv,
        z = is_variable
    )

PCA

Principal component analysis

Scale all features.

# z-score
seurat_proj <- seurat_proj %>%
    ScaleData(
        features = rownames(seurat_proj),
        vars.to.regress = NULL,
        model.use = "linear",
        use.umi = FALSE,
        do.scale = TRUE,
        do.center = TRUE,
        verbose = TRUE
    )
## Centering and scaling data matrix

Use all features.

seurat_proj <- seurat_proj %>%
    RunPCA(
        assay = NULL,
        features = rownames(seurat_proj),
        npcs = N_COMPONENTS,
        rev.pca = FALSE,
        weight.by.var = TRUE,
        verbose = TRUE,
        ndims.print = 1:2,
        nfeatures.print = 5,
        reduction.name = "pca",
        reduction.key = "PC_",
        seed.use = SEED_USE
    )
## PC_ 1 
## Positive:  ENSMUSG00000040752-Myh6, ENSMUSG00000026414-Tnnt2, ENSMUSG00000068614-Actc1, ENSMUSG00000035458-Tnni3, ENSMUSG00000051747-Ttn 
## Negative:  ENSMUSG00000001025-S100a6, ENSMUSG00000029761-Cald1, ENSMUSG00000068220-Lgals1, ENSMUSG00000024529-Lox, ENSMUSG00000060802-B2m 
## PC_ 2 
## Positive:  ENSMUSG00000032366-Tpm1, ENSMUSG00000031633-Slc25a4, ENSMUSG00000025393-Atp5b, ENSMUSG00000000088-Cox5a, ENSMUSG00000097445-Gm26631 
## Negative:  ENSMUSG00000027750-Postn, ENSMUSG00000002985-Apoe, ENSMUSG00000019929-Dcn, ENSMUSG00000027239-Mdk, ENSMUSG00000040488-Ltbp4

Batch effect removal

Add batch information to seurat object.

seurat_proj <- seurat_proj %>% AddMetaData(
    metadata = colnames(seurat_proj) %>%
        str_remove(pattern = "_[A-Z]{12}.bam"),
    col.name = "batch"
)

seurat_proj@meta.data %>%
    pull(batch) %>%
    table() %>%
    enframe(
        name = "batch",
        value = "num_cells"
    )

Run Harmony algorithm on PCs.

set.seed(seed = SEED_USE)
seurat_proj <- seurat_proj %>%
    harmony::RunHarmony(
        group.by.vars = "batch",
        reduction = "pca",
        dims.use = NULL,
        theta = NULL,
        lambda = NULL,
        nclust = NULL,
        max.iter.harmony = 10,
        max.iter.cluster = 20,
        epsilon.cluster = 1e-05,
        epsilon.harmony = 1e-04,
        plot_convergence = FALSE,
        verbose = TRUE,
        reduction.save = "harmony",
        assay.use = "RNA",
        project.dim = TRUE,
    )
## Harmony 1/10
## Harmony 2/10
## Harmony 3/10
## Harmony 4/10
## Harmony 5/10
## Harmony 6/10
## Harmony 7/10
## Harmony 8/10
## Harmony converged after 8 iterations
## Warning: Invalid name supplied, making object name syntactically valid. New
## object name is Seurat..ProjectDim.RNA.harmony; see ?make.names for more details
## on syntax validity
# check
Embeddings(object = seurat_proj, reduction = "harmony") %>%
    dim()
## [1] 25776    50

t-SNE

seurat_proj <- seurat_proj %>%
    RunTSNE(
        reduction = "harmony",
        cells = NULL,
        dims = 1:N_COMPONENTS_SELECTED,
        features = NULL,
        seed.use = SEED_USE,
        tsne.method = "Rtsne",
        dim.embed = 2,
        distance.matrix = NULL,
        reduction.name = "tsne",
        reduction.key = "tSNE_",
        #
        perplexity = 30
        # max_iter = 3000
    )

UMAP

seurat_proj <- seurat_proj %>%
    RunUMAP(
        reduction.model = NULL,
        dims = 1:N_COMPONENTS_SELECTED,
        reduction = "harmony",
        features = NULL,
        graph = NULL,
        assay = "RNA",
        umap.method = "uwot",
        n.neighbors = 15L,
        n.components = 2L,
        # metric = "euclidean",
        metric = "cosine",
        n.epochs = NULL,
        learning.rate = 1,
        min.dist = 0.1,
        spread = 1,
        uwot.sgd = FALSE,
        seed.use = SEED_USE,
        verbose = TRUE,
        reduction.name = "umap",
        reduction.key = "UMAP_"
    )
## Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
## To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
## This message will be shown once per session
## 15:55:48 UMAP embedding parameters a = 1.577 b = 0.8951
## 15:55:48 Read 25776 rows and found 10 numeric columns
## 15:55:48 Using Annoy for neighbor search, n_neighbors = 15
## 15:55:48 Building Annoy index with metric = cosine, n_trees = 50
## 0%   10   20   30   40   50   60   70   80   90   100%
## [----|----|----|----|----|----|----|----|----|----|
## **************************************************|
## 15:55:54 Writing NN index file to temp file /var/folders/h1/78b2tkd552ngjl6_ps_5sw7r0000gn/T//RtmpsOcJ6C/filec5e657aeab9a
## 15:55:54 Searching Annoy index using 1 thread, search_k = 1500
## 15:56:00 Annoy recall = 100%
## 15:56:00 Commencing smooth kNN distance calibration using 1 thread
## 15:56:01 Initializing from normalized Laplacian + noise
## 15:56:03 Commencing optimization for 200 epochs, with 513252 positive edges
## 15:56:14 Optimization finished

Clustering

seurat_proj <- seurat_proj %>%
    FindNeighbors(
        reduction = "harmony",
        dims = 1:N_COMPONENTS_SELECTED,
        assay = NULL,
        features = NULL,
        k.param = 20,
        compute.SNN = TRUE,
        nn.method = "rann",
        annoy.metric = "euclidean",
        nn.eps = 0,
        verbose = TRUE,
        do.plot = FALSE,
    )
## Computing nearest neighbor graph
## Computing SNN
seurat_proj <- seurat_proj %>%
    FindClusters(
        modularity.fxn = 1,
        initial.membership = NULL,
        weights = NULL,
        node.sizes = NULL,
        resolution = 0.8,
        method = "igraph",
        algorithm = 1,
        n.start = 100,
        n.iter = 100,
        random.seed = SEED_USE,
        verbose = TRUE
    )
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 25776
## Number of edges: 819208
## 
## Running Louvain algorithm...
## Maximum modularity in 100 random starts: 0.8854
## Number of communities: 20
## Elapsed time: 57 seconds

Summarize clustering result.

seurat_proj %>%
    Idents() %>%
    table() %>%
    enframe(
        name = "cluster",
        value = "num_cells"
    )

Visualization

Format batch information.

batch <- setNames(
    object = c(
        "JD131", "JD131", "JD131", "JD131", "JD135", "JD136", "JD137", "JD131",
        "JD131", "JD131", "JD136", "JD136", "JD136", "JD136", "JD146", "JD146",
        "JD146", "JD146", "JD146", "JD146", "JD136", "JD136", "JD136", "JD136",
        "JD136", "JD136", "JD136", "JD136", "JD136", "JD136", "JD136", "JD136",
        "JD136", "JD136", "JD136", "JD136", "JD136", "JD136", "JD136", "JD136",
        "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168",
        "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD136",
        "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168",
        "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168",
        "JD136", "JD136", "JD174", "JD174", "JD136", "JD136", "JD168", "JD168",
        "JD168", "JD168", "JD168", "JD168", "JD174", "JD174", "JD174", "JD174",
        "JD174", "JD135", "JD135", "JD135", "JD135"
    ),
    nm = c(
        "JD126-1-2", "JD131-A", "JD131-B", "JD131-C", "JD135A", "JD136A",
        "JD137A", "JD126A1", "JD126A5", "JD126B", "JD145A1", "JD145A5",
        "JD145B1", "JD145B5", "JD146A1", "JD146A5", "JD146B1", "JD146B5",
        "JD146C1", "JD146C5", "JD145C", "JD145D", "JD145E", "JD149A", "JD149B",
        "JD150A", "JD150B", "JD145F", "JD149C", "JD149D", "JD149E", "JD136B",
        "JD136C", "JD136DE", "JD136F", "JD136G", "JD150C", "JD150D",
        "JD150-3A", "JD150-3B", "JD164_165", "JD166_167", "JD168_169",
        "JD168A", "JD168B", "JD168C", "JD169A", "JD169B", "JD169C", "JD170A",
        "JD170B", "JD170C", "JD171A", "JD171B", "JD171C", "JD150-3C",
        "JD170_171", "PZ473", "PZ474", "PZ475", "PZ476", "PZ477", "PZ478",
        "PZ479", "PZ480", "PZ481", "PZ482", "PZ483", "PZ484", "PZ485", "PZ486",
        "PZ487", "PZ492", "PZ493", "PZ496", "PZ497", "JD150-4A", "JD150-4B",
        "PZ580", "PZ581", "PZ582", "PZ583", "PZ584", "PZ585", "PZ586", "PZ587",
        "PZ588", "PZ589", "PZ590", "PZ660", "PZ661", "JD135Z", "JD135Y"
    )
)

batch <- setNames(
    object = batch,
    nm = names(batch) %>% str_replace_all(pattern = "-", replacement = ".")
)

Cluster embedding

Prepare embedding data.

embedding <- seurat_proj@reductions$umap@cell.embeddings %>%
    cbind(
        "cluster" = Idents(seurat_proj),
        seurat_proj@reductions$tsne@cell.embeddings
    ) %>%
    as.data.frame() %>%
    mutate(cell = rownames(.)) %>%
    relocate(cell, cluster) %>%
    rename(
        "x_umap" = "UMAP_1",
        "y_umap" = "UMAP_2",
        "x_tsne" = "tSNE_1",
        "y_tsne" = "tSNE_2"
    )

embedding %>% head()

Visualize different cell groups.

x_column <- "x_tsne"
y_column <- "y_tsne"

p_embedding_cluster <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    title = "t-SNE; Cluster",
    group = as.vector(embedding$cluster) %>% as.factor(),
    show_group_labels = TRUE,
    geom_point_size = 0.6
) + customized_theme_style()
## `summarise()` ungrouping output (override with `.groups` argument)
p_embedding_primary <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    title = "t-SNE; Primary",
    group = (!batch[embedding$cell %>%
        str_remove("_[A-Z]{12}.bam")] %in%
        c("JD168", "JD174")) %>%
        as.integer() %>% as.factor(),
    show_group_labels = FALSE,
    geom_point_size = 0.6,
    sort_values = TRUE
) +
    customized_theme_style() +
    scale_color_manual(
        values = c("grey70", "salmon")
    )

p_embedding_reprogramming <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    title = "t-SNE; Reprogramming",
    group = batch[embedding$cell %>%
        str_remove("_[A-Z]{12}.bam")] %in% c("JD168") %>%
        as.integer() %>%
        as.factor(),
    show_group_labels = FALSE,
    geom_point_size = 0.6,
    sort_values = TRUE
) +
    customized_theme_style() +
    scale_color_manual(
        values = c("grey70", "salmon")
    )

p_embedding_control <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    title = "t-SNE; Control",
    group = batch[embedding$cell %>%
        str_remove("_[A-Z]{12}.bam")] %in% c("JD174") %>%
        as.integer() %>%
        as.factor(),
    show_group_labels = FALSE,
    geom_point_size = 0.6,
    sort_values = TRUE
) +
    customized_theme_style() +
    scale_color_manual(
        values = c("grey70", "salmon")
    )
(p_embedding_cluster | p_embedding_primary) / (
    p_embedding_reprogramming | p_embedding_control
)

Expression

Prepare helper function.

plot_embedding_feature <- function(selected_feature,
                                   xx = "x_tsne",
                                   yy = "y_tsne",
                                   label_prefix = "t-SNE") {
    p_embedding <- plot_embedding(
        embedding = embedding[, c(xx, yy)],
        title = paste0(label_prefix, "; ", selected_feature),
        group = log10(matrix_cpm_use[selected_feature, embedding$cell] + 1),
        show_group_labels = FALSE,
        geom_point_size = 0.6,
        color_legend = TRUE,
        sort_values = TRUE,
        strip.text = element_text(
            family = "Arial",
            size = 6
        ),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.justification = c(1, 0),
        legend.position = c(.92, .08),
        legend.text = element_text(
            family = "Arial",
            size = 4,
            margin = margin(
                t = 0,
                r = 0,
                b = 0,
                l = -1.8,
                unit = "mm"
            )
        ),
        legend.key.size = unit(1.5, "mm"),
        legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm")
    ) +
        scale_color_viridis_c(
            name = NULL
        )

    return(p_embedding)
}

t-SNE

selected_feature <- "ENSMUSG00000025105_Bnc1"
p_embedding_Bnc1 <- plot_embedding_feature(selected_feature = selected_feature)

selected_feature <- "ENSMUSG00000009471_Myod1"
p_embedding_Myod1 <- plot_embedding_feature(selected_feature = selected_feature)
p_embedding_Myod1 | p_embedding_Bnc1

embedding %>%
    filter(
        cluster == 13
    ) %>%
    pull(cell) %>%
    str_remove(
        pattern = "_[A-Z]{12}.bam"
    ) %>%
    batch[.] %>%
    table()
## .
## JD131 JD135 JD136 JD137 JD146 JD168 JD174 
##    51    20   282     2    33   170    45

R session info

if (require(devtools)) {
    devtools::session_info()
} else {
    sessionInfo()
}
## Loading required package: devtools
## Loading required package: usethis
## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value                       
##  version  R version 4.0.1 (2020-06-06)
##  os       macOS Catalina 10.15.5      
##  system   x86_64, darwin19.5.0        
##  ui       unknown                     
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       America/Chicago             
##  date     2020-06-17                  
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  package      * version     date       lib
##  ape            5.4         2020-06-03 [1]
##  assertthat     0.2.1       2019-03-21 [1]
##  backports      1.1.8       2020-06-17 [1]
##  blob           1.2.1       2020-01-20 [1]
##  broom          0.7.0.9000  2020-06-09 [1]
##  callr          3.4.3.9000  2020-06-17 [1]
##  cellranger     1.1.0       2016-07-27 [1]
##  cli            2.0.2       2020-02-28 [1]
##  cluster        2.1.0       2019-06-19 [2]
##  codetools      0.2-16      2018-12-24 [2]
##  colorspace     1.4-1       2019-03-18 [1]
##  cowplot        1.0.0       2019-07-11 [1]
##  crayon         1.3.4       2017-09-16 [1]
##  data.table     1.12.8      2019-12-09 [1]
##  DBI            1.1.0       2019-12-15 [1]
##  dbplyr         1.4.4       2020-05-27 [1]
##  desc           1.2.0       2018-05-01 [1]
##  devtools     * 2.3.0.9000  2020-06-16 [1]
##  digest         0.6.25      2020-02-23 [1]
##  dplyr        * 1.0.0.9000  2020-06-16 [1]
##  ellipsis       0.3.1       2020-05-15 [1]
##  evaluate       0.14        2019-05-28 [1]
##  extrafont    * 0.17        2014-12-08 [1]
##  extrafontdb    1.0         2012-06-11 [1]
##  fansi          0.4.1       2020-01-08 [1]
##  farver         2.0.3       2020-01-16 [1]
##  fitdistrplus   1.1-1       2020-05-19 [1]
##  forcats      * 0.5.0.9000  2020-05-28 [1]
##  fs             1.4.1       2020-04-04 [1]
##  future         1.17.0      2020-04-18 [1]
##  future.apply   1.5.0       2020-04-17 [1]
##  generics       0.0.2       2018-11-29 [1]
##  ggplot2      * 3.3.1.9000  2020-06-16 [1]
##  ggrepel        0.9.0       2020-04-25 [1]
##  ggridges       0.5.2       2020-01-12 [1]
##  globals        0.12.5      2019-12-07 [1]
##  glue           1.4.1       2020-05-13 [1]
##  gridExtra      2.3         2017-09-09 [1]
##  gtable         0.3.0       2019-03-25 [1]
##  harmony        1.0         2020-04-29 [1]
##  haven          2.3.1       2020-06-01 [1]
##  hms            0.5.3       2020-01-08 [1]
##  htmltools      0.5.0       2020-06-16 [1]
##  htmlwidgets    1.5.1       2019-10-08 [1]
##  httr           1.4.1       2019-08-05 [1]
##  ica            1.0-2       2018-05-24 [1]
##  igraph         1.2.5       2020-03-19 [1]
##  irlba          2.3.3       2019-02-05 [1]
##  jsonlite       1.6.1       2020-02-02 [1]
##  KernSmooth     2.23-17     2020-04-26 [2]
##  knitr          1.28        2020-02-06 [1]
##  labeling       0.3         2014-08-23 [1]
##  lattice        0.20-41     2020-04-02 [2]
##  lazyeval       0.2.2       2019-03-15 [1]
##  leiden         0.3.3       2020-02-04 [1]
##  lifecycle      0.2.0       2020-03-06 [1]
##  listenv        0.8.0       2019-12-05 [1]
##  lmtest         0.9-37      2019-04-30 [1]
##  lubridate      1.7.9       2020-06-14 [1]
##  magrittr     * 1.5.0.9000  2020-04-24 [1]
##  MASS           7.3-51.6    2020-04-26 [2]
##  Matrix       * 1.2-18      2019-11-27 [2]
##  memoise        1.1.0       2017-04-21 [1]
##  modelr         0.1.8.9000  2020-05-19 [1]
##  munsell        0.5.0       2018-06-12 [1]
##  nlme           3.1-148     2020-05-24 [2]
##  patchwork    * 1.0.0.9000  2020-06-17 [1]
##  pbapply        1.4-2       2019-08-31 [1]
##  pillar         1.4.4       2020-05-05 [1]
##  pkgbuild       1.0.8       2020-05-07 [1]
##  pkgconfig      2.0.3       2019-09-22 [1]
##  pkgload        1.1.0       2020-05-29 [1]
##  plotly         4.9.2.1     2020-04-04 [1]
##  plyr           1.8.6       2020-03-03 [1]
##  png            0.1-7       2013-12-03 [1]
##  prettyunits    1.1.1.9000  2020-04-24 [1]
##  processx       3.4.2       2020-02-09 [1]
##  ps             1.3.3       2020-05-08 [1]
##  purrr        * 0.3.4.9000  2020-05-28 [1]
##  R6             2.4.1.9000  2020-06-12 [1]
##  RANN           2.6.1       2019-01-08 [1]
##  RColorBrewer   1.1-2       2014-12-07 [1]
##  Rcpp           1.0.4.6     2020-04-09 [1]
##  RcppAnnoy      0.0.16      2020-03-08 [1]
##  readr        * 1.3.1.9000  2020-05-28 [1]
##  readxl         1.3.1.9000  2020-05-28 [1]
##  remotes        2.1.1.9000  2020-05-01 [1]
##  reprex         0.3.0       2019-05-16 [1]
##  reshape2       1.4.4       2020-04-09 [1]
##  reticulate   * 1.16        2020-05-27 [1]
##  rlang          0.4.6.9000  2020-06-17 [1]
##  rmarkdown      2.2.6       2020-06-17 [1]
##  ROCR           1.0-11      2020-05-02 [1]
##  rprojroot      1.3-2       2018-01-03 [1]
##  RSpectra       0.16-0      2019-12-01 [1]
##  rstudioapi     0.11.0-9000 2020-06-11 [1]
##  rsvd           1.0.3       2020-02-17 [1]
##  Rtsne          0.16        2020-04-24 [1]
##  Rttf2pt1       1.3.8       2020-01-10 [1]
##  rvest          0.3.5       2019-11-08 [1]
##  scales         1.1.1       2020-05-11 [1]
##  sctransform    0.2.1       2019-12-17 [1]
##  sessioninfo    1.1.1       2018-11-05 [1]
##  Seurat       * 3.1.5.9008  2020-06-17 [1]
##  stringi        1.4.6       2020-02-17 [1]
##  stringr      * 1.4.0.9000  2020-06-01 [1]
##  styler       * 1.3.2.9000  2020-06-06 [1]
##  survival       3.2-3       2020-06-13 [2]
##  testthat       2.3.2.9000  2020-06-17 [1]
##  tibble       * 3.0.1.9000  2020-06-17 [1]
##  tidyr        * 1.1.0.9000  2020-05-26 [1]
##  tidyselect     1.1.0       2020-05-11 [1]
##  tidyverse    * 1.3.0.9000  2020-06-01 [1]
##  usethis      * 1.6.1.9000  2020-06-12 [1]
##  uwot           0.1.8.9000  2020-04-24 [1]
##  vctrs          0.3.1.9000  2020-06-17 [1]
##  viridisLite    0.3.0       2018-02-01 [1]
##  withr          2.2.0       2020-04-20 [1]
##  xfun           0.14        2020-05-20 [1]
##  xml2           1.3.2       2020-04-23 [1]
##  yaml           2.2.1       2020-02-01 [1]
##  zoo            1.8-8       2020-05-02 [1]
##  source                                 
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.1)                         
##  CRAN (R 4.0.0)                         
##  Github (tidymodels/broom@c7bef07)      
##  Github (r-lib/callr@b96da8f)           
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.1)                         
##  CRAN (R 4.0.1)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (r-lib/devtools@020c1d2)        
##  CRAN (R 4.0.0)                         
##  Github (tidyverse/dplyr@fd08fe9)       
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (tidyverse/forcats@ab81d1b)     
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (tidyverse/ggplot2@7e9e9d6)     
##  Github (slowkow/ggrepel@3941cf1)       
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (immunogenomics/harmony@88b1e2a)
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.1)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.1)                         
##  CRAN (R 4.0.1)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.1)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (tidyverse/lubridate@bccea9a)   
##  Github (tidyverse/magrittr@93cdc9a)    
##  CRAN (R 4.0.1)                         
##  CRAN (R 4.0.1)                         
##  CRAN (R 4.0.0)                         
##  Github (tidyverse/modelr@16168e0)      
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.1)                         
##  Github (thomasp85/patchwork@3616cd1)   
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (r-lib/prettyunits@b1cdad8)     
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (tidyverse/purrr@5e9888a)       
##  Github (r-lib/R6@1415d11)              
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (tidyverse/readr@ec0d898)       
##  Github (tidyverse/readxl@3815961)      
##  Github (r-lib/remotes@9b5dc29)         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (r-lib/rlang@7f0c363)           
##  Github (rstudio/rmarkdown@656b3f4)     
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (rstudio/rstudioapi@ed5dd25)    
##  CRAN (R 4.0.0)                         
##  Github (jkrijthe/Rtsne@14b195f)        
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  Github (satijalab/seurat@7c386af)      
##  CRAN (R 4.0.0)                         
##  Github (tidyverse/stringr@f70c4ba)     
##  Github (r-lib/styler@9c5d883)          
##  CRAN (R 4.0.1)                         
##  Github (r-lib/testthat@b684f1e)        
##  Github (tidyverse/tibble@3f4e5df)      
##  Github (tidyverse/tidyr@3899ed5)       
##  CRAN (R 4.0.0)                         
##  Github (hadley/tidyverse@8a0bb99)      
##  Github (r-lib/usethis@5475c46)         
##  Github (jlmelville/uwot@cbb78b5)       
##  Github (r-lib/vctrs@833956a)           
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
##  CRAN (R 4.0.0)                         
## 
## [1] /usr/local/lib/R/4.0/site-library
## [2] /usr/local/Cellar/r/4.0.1/lib/R/library